from django.http import HttpResponse
from django.shortcuts import render_to_response
from json import dumps
from aircleaner.models import db_add_record, SensorData, db_remove_all
from time import mktime

# 一个全局的json字符串，用来记录“空气净化器”的电源状态：0表示关闭，１表示开启
AIR_CLEANRE_PWR_STATUS = dumps({'value': 0})

# Web页面图表每次显示记录数
DATA_RECORD_MAX_COUNT = 25

# Create your views here.
# 渲染页面：首页
def index(request):
    return render_to_response('index.html')


# 渲染页面：空气质量监测显示页面
def air_quality(request):
    return render_to_response('air_quality.html')


# 渲染页面：系统的详细介绍页面
def system_description(request):
    return render_to_response('system_desc.html')


# 与Web页面交互：接收来自web页面post请求，更改空气净化器的电源状态
def set_air_cleaner_pwr_status(request):
    global AIR_CLEANRE_PWR_STATUS
    if request.method == 'POST':
        # 接收的是一个json格式的字符串
        str = request.body.decode()
        # 根据状态改变空气净化器电源状态
        if str[-1] == '1':
            AIR_CLEANRE_PWR_STATUS = dumps({'value': 1})
        elif str[-1] == '0':
            AIR_CLEANRE_PWR_STATUS = dumps({'value': 0})
    # 测试，删除所有记录
    # db_remove_all()
    return HttpResponse(AIR_CLEANRE_PWR_STATUS, content_type='application/json')


# 获取空气净化器状态
def get_air_cleaner_pwr_status(request):
    return HttpResponse(AIR_CLEANRE_PWR_STATUS, content_type='application/json')


# 与Web页面交互：接收来自web页面的post请求，从数据库中加载数据并显示
def get_sensor_data(request):
    # 如果数据量太大，可能会导致绘图出现问题。
    # 这个地方其实是有可能发生异常的，所以需要解决。因为可能访问不存在的记录。

    # 具体的做法就是当数据记录不足设定最大值时，把这些记录全部索引过来。
    datas = SensorData.objects.order_by("-time")
    if datas.count() < DATA_RECORD_MAX_COUNT:
        datas = datas[0:datas.count()]
    else:
        datas = datas[0: DATA_RECORD_MAX_COUNT]

    # 使用json.dumps可以将该字典存储的数据转换成json字符串返回。
    datadic = dict()

    # 构建数据
    # 在这里，需要得到转换好的时间戳，当然这个地方使用的方式不是特别明智，因为会重复计算。
    templist = [[1000 * int(mktime(data.time.timetuple())), data.temperature] for data in datas]
    humlist = [[1000 * int(mktime(data.time.timetuple())), data.humidity] for data in datas]
    co2list = [[1000 * int(mktime(data.time.timetuple())), data.co2] for data in datas]
    dustlist = [[1000 * int(mktime(data.time.timetuple())), data.dust] for data in datas]

    # 需要逆序，否则输出的时候不雅观啊！
    templist.reverse()
    humlist.reverse()
    co2list.reverse()
    dustlist.reverse()

    # 添加到字典
    datadic['temp'] = templist
    datadic['hum'] = humlist
    datadic['co2'] = co2list
    datadic['dust'] = dustlist

    # 打包成json字符串
    series = dumps(datadic)
    return HttpResponse(series, content_type="application/json")


# 接收来自Arduino上传的数据，并更新数据库
def update_sensor_data(request):
    if request.method == 'POST':
        # 把得到的bytes对像转换成string，再给添加数据库记录的函数传递
        return HttpResponse(dumps(db_add_record(request.body.decode())))
    else:
        return HttpResponse(dumps({'info': 'Get ok.'}))